package com.feri.sg.goods.service.impl;

import com.alibaba.fastjson.JSON;
import com.feri.sg.constant.RedisKeyConfig;
import com.feri.sg.goods.domain.Activity;
import com.feri.sg.goods.mapper.ActivityMapper;
import com.feri.sg.goods.service.ActivityService;
import com.feri.sg.pojo.bo.ActivityAddBo;
import com.feri.sg.pojo.bo.AuditBo;
import com.feri.sg.pojo.vo.R;
import org.springframework.beans.BeanUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * ━━━━━━Feri出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃    邢哥的代码，怎么会，有bug呢，不可能！
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 *
 * @Description:
 * @Author：邢朋辉
 * @Date: 2023/6/20 15:17
 */
@Service
public class ActivityServiceImpl implements ActivityService {
    @Resource
    private ActivityMapper mapper;
    @Resource
    private StringRedisTemplate template;

    @Override
    public R save(ActivityAddBo bo) {
        //1.校验
        if(bo!=null){
            //2.内容校验
            if(StringUtils.hasLength(bo.getName())){
                return R.fail("亲，活动名称不能为空！");
            }
            Activity activity=new Activity();
            BeanUtils.copyProperties(bo,activity);
            activity.setIsDel(0);
            activity.setStatus(0);
            activity.setTotalTime((activity.getEndtime().getTime()-activity.getBegintime().getTime())/1000.0F);
            //3.操作数据库
            if(mapper.insert(activity)>0){
                return R.ok();
            }
        }
        return R.fail("新增秒杀活动失败！");
    }

    @Transactional //开启事务 保证mysql和redis操作一致性 异常会回滚
    @Override
    public R audit(AuditBo bo) {
        //1.校验
        if(bo!=null){
            Activity activity=new Activity();
            activity.setId(bo.getId());
            activity.setStatus(bo.getStatus());

            //2.修改数据库
            if(mapper.updateById(activity)>0){
                //3.验证活动是否审核通过
                if(activity.getStatus()==1){
                    activity=mapper.selectById(bo.getId());
                    //4.缓存 数据 到Redis
                    //记录活动开始倒计时
                    template.opsForValue().set(RedisKeyConfig.ACTIVITY_TTL+bo.getId(),activity.getName(),
                            (activity.getBegintime().getTime()-System.currentTimeMillis())/1000, TimeUnit.SECONDS);
                    //记录秒杀活动的商品
                    template.opsForHash().put(RedisKeyConfig.ACTIVITYS,bo.getId(), JSON.toJSONString(activity));
                    return R.ok();
                }
            }
        }
        return R.fail("审核秒杀活动失败！");
    }

    @Override
    public R all() {
        return R.ok(mapper.selectList(null));
    }
}
